USB Device 升级(onebin)


1. 简介


1.1. 升级方式类别

  1. 空片 模式  usb device升级

  2. uboot 模式 usb device 升级

  3. kernel模式 usb device 升级(uvc模式)

  4. kernel 模式 usb device 升级 (U盘模式)


1.2. 测试环境

pcb:ssd212 demo board 

内核配置:pioneer3_spinand_defconfig

project配置:dispcam_p3_spinand.glibc-9.1.0-s01a.64.qfn128.demo_defconfig

usbtool:usbdownloadtool 2.1


2. 空片 模式  usb device升级

需求场景:已有完整pcb,有usb 接口,但是nandflash或norflash里面为空。

实现原理:IC上电先执行rom code,然后根据外部硬件配置跳转到nandflash/norflash中执行IPL,没有找到IPL资料,系统自动进入ufu的升级模式。通过pc tool 预加载u-boot.bin。

此模式下要求:预加载的u-boot.bin 本身具备ufu升级能力。

操作步骤:

  1. uboot配置

    将编译生成的u-boot_spinand.img.bin 或u-boot.img.bin 重新命名u-boot.bin (仅仅用作空片引导)。下面操作流程会用到此文件。

  2. 按正常流程编译整包sdk,生成image升级文件。

  3. 下载工具包(此处nandflash为例)   这里需要针对bulid的不同flash使用不同的工具包(相应的sdk中tools包含升级工具):

    SPINOR FLASH升级工具包:usbloadertool_onebin_spinor_20210104.rar

    SPINAND FLASH升级工具包:usbloadertool_onebin_spinand_20210104.rar.rar

    将对应的工具包解压到image路径下。

  4. 将生成的u-boot.bin替换到此处。

  5. 空片模式上电,接入usb。可以观察到pc上有接入存储设备

  6. 执行USBDownloadTool.exe , 正常情况下如图。

    通常系统正常升级后,可通过串口可以观察开机过程。


3. uboot 模式 usb device 升级介绍

需求场景:已有完整pcb,有usb 接口,确保系统可进入uboot模式

实现原理: norflash或nandfash里面已经有uboot。且此份uboot支持device模式下接pc升级,通过执行uboot和pc软件进行交互,完成下载升级

此模式下要求:uboot 本身具备ufu升级能力。

操作步骤:

  1. 配置uboot

    支持ufu升级,但是不开启自动运行。

  2. 将uboot烧录入flash。此boot具有ufu升级能力。

    如果需要在uboot来使用usb device升级功能。

    需要在boot模式下设定如下参数,开机会进入device升级模式。

    setenv ota_upgrade_status 1
    
    saveenv
    
  3. 下载工具包(此处nandflash为例)

    这里需要针对bulid的不同flash使用不同的工具包(相应的sdk中tools包含升级工具)

    SPINOR FLASH升级工具包:usbloadertool_onebin_spinor_20210104.rar

    SPINAND FLASH升级工具包:usbloadertool_onebin_spinand_20210104.rar.rar

    将对应的工具包解压到image路径下

  4. 重新上电开机后,系统进入如下。

  5. 执行USBDownloadTool.exe 开始升级


4. kernel模式 usb device 升级(uvc模式)

此处分为两部分:内核配置和应用程序 

实现原理:板端会配置为uvc模式。通过应用pc tool下命令到板端的应用程序。之后设置环境变量,最终利用uboot下的ufu升级功能完成升级。

在验证kernel下的usb 升级的时候,首先要确保uboot下可以正常使用usb device升级。

此模式要求:

0:uboot支持ufu升级。参考uboot 模式 usb device 升级介绍

1:内核配置uvc模式

2:需要有应用程序mi_uvc

3:USBDownloadTool升级到2.1. 


4.1. 内核配置

在现有配置基础上增加uvc的配置可以通过以下两种方式:

  1. 直接修改当前平台的默认配置。(推荐)

    添加以下配置:

    CONFIG_MEDIA_SUPPORT=m
    CONFIG_MEDIA_CAMERA_SUPPORT=y
    CONFIG_MEDIA_CONTROLLER=y
    CONFIG_VIDEO_DEV=m
    CONFIG_VIDEO_V4L2=m
    CONFIG_VIDEOBUF2_CORE=m
    CONFIG_VIDEOBUF2_MEMOPS=m
    CONFIG_VIDEOBUF2_VMALLOC=m
    CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
    CONFIG_USB_GADGET=m
    CONFIG_USB_GADGET_VBUS_DRAW=2
    CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
    CONFIG_USB_GADGET_SSTAR_DEVICE=m
    CONFIG_USB_AVOID_SHORT_PACKET_IN_BULK_OUT_WITH_DMA_FOR_ETHERNET=y
    CONFIG_USB_LIBCOMPOSITE=m
    CONFIG_SS_GADGET=m
    CONFIG_USB_F_UVC=m
    CONFIG_USB_G_WEBCAM=m
    CONFIG_USB_WEBCAM_UVC=y
    CONFIG_MULTI_STREAM_FUNC_NUM=1
    
  2. 使用当前平台的默认配置

    make pioneer3_xxxx_defconfig
    

    添加配置:make menuconfig

    1. media 框架配置

      -> Device Drivers
          -> Multimedia support
      
      -> Device Drivers
          -> Multimedia support
              -> Cameras/video grabbers support
      
      -> Device Drivers
          -> Multimedia support
              -> Media Controller API
      

      输出模块: media.ko videodev.ko v4l2-common.ko

  3. usb Gadget 框架配置

        -> Device Drivers
            -> USB support
    
        -> Device Drivers
            -> USB support
                -> USB Gadget Support
    
    输出模块:usb-common.ko udc-core.ko
    
    1. udc 驱动配置:该模块为硬件ip相关模块,视具体情况进行配置

      -> Device Drivers
          -> USB support
              -> USB Gadget Support
                  -> USB Peripheral Controller
                      -> Sstar USB 2.0 Device Controller
      

      输出模块:udc-msb250x.ko

  4. gadget webcam

        -> Device Drivers
            -> USB support
                -> USB Gadget Support
                    -> USB Gadget Drivers
    
        -> Device Drivers
            -> USB support
            -> USB Gadget Support
                -> USB Gadget Drivers
                    -> USB Webcam Gadget
    
        -> Device Drivers
            -> USB support
                -> USB Gadget Support
                    -> USB Peripheral Controller
                        -> Sstar USB 2.0 Device Controller
                            -> Avoid short packet in bulk out with DMA for ethernet
    
    输出模块:libcomposite.ko videobuf2-core.ko videobuf2-v4l2.ko videobuf2-memops.ko videobuf2-vmalloc.ko usb_f_uvc.ko g_webcam.ko
    

project配置,因目前没有添加UVC相关配置,所以编译uvc功能时需手动修改以下两个文件:

  1. 若是在kernel配置中使用方式二配置则需修改project/makefile文件,注释掉image目标下的$(MAKE) linux-kernel,以免重新编译kernel覆盖了之前手动编译的kernel;

  2. project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late文件,修改为内容:

    media.ko
    videodev.ko
    v4l2-common.ko
    usb-common.ko
    #usbcore.ko
    #ehci-hcd.ko
    #scsi_mod.ko
    #usb-storage.ko
    videobuf2-core.ko
    videobuf2-v4l2.ko
    videobuf2-memops.ko
    videobuf2-vmalloc.ko
    udc-core.ko
    libcomposite.ko
    usb_f_uvc.ko
    udc-msb250x.ko
    g_webcam.ko streaming_maxpacket=3072 streaming_maxburst=13 uac_function_enable=0
    

4.2. 应用程序

源码参考 myuvc_remove_media.zip

应用程序编译(略)

应用端执行程序 mi_uvc

核心代码:

case UVC_SET_CUR:
    if (cfg->bCmdCap & CAP_SET_CUR_CMD) {
        UVC_INFO("/etc/fw_setenv ota_upgrade_status 1\n");
        system("/etc/fw_setenv ota_upgrade_status 1");
       system("sleep 1");
        system("reboot");
        if (cfg->bInfoCap & INFO_AUTO_MODE_SUPPORT) {

        }
    }
    else {
        goto invalid_req;
    }

操作流程:

参考上述的方式编译kernel,更新 image后执行应用程序。

接入usb 到pc 后,执行USBDownloadTool.exe。板端收到uvc的cmd后,会重新设置env自动重启进入uboot升级模式。

重新点击“upgrade firmware”,正式进入升级状态。


5. kernel 模式 usb device 升级 (U盘模式)

需求场景:没有使用uvc场景下。例如:u盘模式

实现原理:  默认情况下, USBDownloadTool 还是首先检测 device是不是 uvc,如果是 uvc, 就跟上面 uvc 升级步骤一模一样; 如果不是 uvc, 才会使用到扩展升级。 为了支持扩展升级, USBDownloadTool 将会通过 EP0 下发自定义的 setup command 来取代 XU command, 通知板子进行升级。( 注: 特殊的 setup command 已添加到 usb gadget driver 中, 须更新到相应版本, 才能进行升级。注意此文件composite.c 有更新)

此模式要求:

0:uboot本身具有ufu升级能力。

1:kernel 支持 u 盘模式。 

2:USBDownloadTool升级到2.1. 

配置方式:

  1. uboot 配置,参考上面:uboot 模式 usb device 升级介绍 

  2. kernel 支持usb device mass storage 功能

驱动配置方法:

  1. usb Gadget 框架配置

    -> Device Drivers
        -> USB support
    
    -> Device Drivers
        -> USB support
            -> USB Gadget Support
    

    输出模块:usb-common.ko udc-core.ko

  2. 配置支持configfs

    -> Device Drivers
        -> USB Gadget Support
            -> USB functions configurable through configfs
    

    如果配置成模块,需要安装对应驱动:libcomposite.ko

  3. 芯片ip相关驱动

    例如:USB device2.0 驱动

    -> Device Drivers
        -> USB support
        -> USB Gadget Support
            -> USB Peripheral Controller
            -> Sstar USB 2.0 Device Controller
    

    生成驱动: udc-msb250x.ko

  4. usb function相关驱动

    需要到以下位置配置子选项:(需要处理 function 所需依赖问题)

    -> Device Drivers
        -> USB support
        -> USB Gadget Support
            -> USB functions configurable through configfs
    
  5. mass storage

    -> Device Drivers
        -> USB support -> USB Gadget Support -> USB Gadget Drivers -> Mass Storage Gadget 生成模块:usb_f_mass_storage.ko
    

  6. insmod ko

    在project/kbuild/customize/4.9.84/p3/dispcam/kernel_mod_list_late修改为:

    usb-common.ko 
    udc-core.ko 
    libcomposite.ko 
    udc-msb250x.ko 
    usb_f_mass_storage.ko
    

    操作流程:

    1. 更新image

    2. 确认加载上面5个ko文件

    3. 执行脚本,配置u 盘参数

      建立文件:dd if=/dev/zero of=/customer/disk.img bs=1M count=20

      ./usb_storage.sh
      
    4. 执行升级脚本

      ./fwupdated &
      
    5. 执行USBDownloadTool 2.1.exe

    6. 选择存储设备,点击ok。图中会显示升级过程,也可以通过串口观察

    7. 相关的配置和测试image,参考附件images-usbotg-storage.7z


6. 无法升级注意事项

  1. 首先确保空片下也可以正常升级,否则查硬件。

  2. 其次确保可以在uboot下完成升级。否则检查硬件和uboot配置

  3. 在kernel 模式下可以正常接收uvc tool的升级命令(可以重启进入uboot升级模式)。确保执行有执行mi_uvc

  4. 如果pc上检测到多个uvc设备,请禁用pc上camera设备。

myuvc_remove_media.zipimages-usbotg-storage.7z仅供参考。